#!/bin/sh

# Copyright (c) Microsoft Corporation
# All rights reserved.
#
# MIT License
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
# documentation files (the "Software"), to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
# to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

set -o errexit
set -o nounset
set -o pipefail

# This init script will be executed inside init container,
# all scripts under init.d will be executed in priority order.
# Init scripts will do preparations before user container starts.
# Runtime script will be executed as the entrypoint of user container
# and will be pid 1 process in user container.

PAI_WORK_DIR=/usr/local/pai
PAI_INIT_DIR=${PAI_WORK_DIR}/init.d
PAI_RUNTIME_DIR=${PAI_WORK_DIR}/runtime.d

PAI_LOG_DIR=${PAI_WORK_DIR}/logs/${FC_POD_UID}
PAI_INIT_LOG_FILE=${PAI_LOG_DIR}/init.log

# Move all runtime sources to PAI_WORK_DIR
mv ./* ${PAI_WORK_DIR}
cd ${PAI_WORK_DIR}

mkdir -p ${PAI_LOG_DIR}

# To run init scripts under init.d in init container,
# execute them here in priority order.s
# Here're the steps to onboard a new init script,
# 1. put it under init.d
# 2. give it a priority in [0, 100] and insert below in order
# 3. add the following format block

# comment for the script purpose
# priority=value
# ${PAI_INIT_DIR}/init.sh >> ${PAI_LOG_FILE} 2>&1

# framework barrier
# priority=0
${PAI_INIT_DIR}/frameworkbarrier > ${PAI_LOG_DIR}/barrier.log 2>&1
echo "barrier returns $?" >> ${PAI_INIT_LOG_FILE}

# generate runtime env variables
# priority=10
python ${PAI_INIT_DIR}/parser.py genenv framework.json > ${PAI_RUNTIME_DIR}/runtime_env.sh 2>> ${PAI_LOG_DIR}/parse.log
echo "parser.py genenv returns $?" >> ${PAI_INIT_LOG_FILE}

# generate jobconfig
# priority=11
python ${PAI_INIT_DIR}/parser.py genconf framework.json > ${PAI_RUNTIME_DIR}/job_config.yaml 2>> ${PAI_LOG_DIR}/parse.log
echo "parser.py genconf returns $?" >> ${PAI_INIT_LOG_FILE}

# Init plugins
# priority=12
python ${PAI_INIT_DIR}/initializer.py ${PAI_RUNTIME_DIR}/job_config.yaml ${PAI_WORK_DIR}/plugins ${PAI_RUNTIME_DIR} ${FC_TASKROLE_NAME} 2>> ${PAI_LOG_DIR}/initializer.log
echo "initializer.py returns $?" >> ${PAI_INIT_LOG_FILE}

# write user commands to user.sh
# priority=100
echo "${USER_CMD}" >> ${PAI_RUNTIME_DIR}/user.sh

# for debug
echo -e "finished entry\nuser.sh has:" >> ${PAI_INIT_LOG_FILE}
cat ${PAI_RUNTIME_DIR}/user.sh >> ${PAI_INIT_LOG_FILE}
echo -e "\nruntime_env.sh has:" >> ${PAI_INIT_LOG_FILE}
cat ${PAI_RUNTIME_DIR}/runtime_env.sh >> ${PAI_INIT_LOG_FILE}
